package com.qqtech.qquan.circle.service;

import java.util.LinkedHashMap;
import java.util.List;

import com.qqtech.core.common.enums.YesNoEnum;
import com.qqtech.core.common.exception.BizzException;
import com.qqtech.core.frame.service.BaseService;
import com.qqtech.qquan.circle.model.CircleMember;
import com.qqtech.qquan.circle.model.CircleMemberQuery;
import com.qqtech.qquan.circle.model.CircleMemberVo;

public interface CircleMemberService extends BaseService<CircleMember> {


	/**
	 * 查询圈子所有成员列表 
	 * 
	 * @param circleId
	 * @return
	 */
	List<CircleMemberVo> queryCircleMembers(int circleId);

	/**
	 * 查询我的圈子id列表(包括我创建和我参加的圈子)-所有的圈子
	 * 
	 * @param userId
	 * @return
	 */
	List<Integer> queryMyCircleIds(CircleMemberQuery query);

	/**
	 * 查询我的圈子id列表(包括我创建和我参加的圈子)-公开的圈子
	 * 
	 * @param userId
	 * @return
	 */
	List<Integer> queryMyOpenCircleIds(Integer userId);
	
	/**
	 * 是否是圈子成员
	 * 
	 * @param userId
	 * @param circleId
	 * @return
	 */
	boolean isCircleMember(Integer userId, Integer circleId);
	
	/**
	 * 是否是圈子成员
	 * 
	 * @param userId
	 * @param circleId
	 * @return
	 */
	CircleMemberVo getCircleMember(Integer userId, Integer circleId);
	
	/**
     * 是否圈子管理员
     * @param userId
     * @param circleId
     * @return
     */
    boolean isCircleManager(Integer userId, Integer circleId);
    
    

	/**
	 * 踢除圈子成员
	 * 
	 * @param circleId
	 *          圈子ID
	 * @param userId
	 *          成员用户ID
	 * @return
	 */
	int handleKickMember(Integer userId, Integer circleId) throws BizzException;
	
	/**
     * 成员主动退出圈子
     *
     * @param userId   用户id
     * @param circleId 圈子id
     * @return
     */
    int handleQuitCircle(Integer userId, Integer circleId) throws BizzException;
    
    /**
     * 用户加入圈子
     * @param userId
     * @param circleId
     * @param isMe2JoinCircle 是否我去加入圈子
     * @return
     */
    int handleJoinCircle(Integer userId, Integer circleId,boolean isMe2JoinCircle) throws BizzException;
    
    /**
     * 普通成员升为管理员（只有圈主才能操作）
     * @param userId
     * @param circleId
     * @return
     * @throws BizzException
     */
    int addCircleManager(Integer userId, Integer circleId) throws BizzException;
    
    /**
     * 管理员降为普通成员（只有圈主才能操作）
     * @param userId
     * @param circleId
     * @return
     * @throws BizzException
     */
    int removeCircleManager(Integer userId, Integer circleId) throws BizzException;
    
    /**
	 * 两个用户共同的圈子id
	 * @param userId
	 * @param userId2
	 * @return
	 */
	List<Integer> queryOurcircleIds(Integer userId,Integer userId2);
	
	/**
	 * 屏蔽一个成员
	 * @param memberId
	 * @param circleId
	 * @param isBlack 1-拉黑;2-不拉黑
	 * @return
	 * @throws BizzException
	 */
	int setBlack(Integer memberId, Integer circleId, boolean isBlack) throws BizzException;
	
	/**
	 * 是否被屏蔽
	 * @param userId
	 * @param circleId
	 * @return
	 */
	boolean isBlack(Integer userId, Integer circleId);
	
	
	/**
	 * 签到次数+1
	 * @param circleId
	 * @param memberId
	 * @return
	 */
	int increaseSignCount(Integer circleId,Integer memberId);
	/**
	 * 话题次数+1
	 * @param circleId
	 * @param memberId
	 * @return
	 */
	int increaseTopicCount(Integer circleId,Integer memberId);
	
	/**
	 * 授权发布投票
	 * @param circleId
	 * @param memberId
	 * @param canAddVote
	 * @return
	 * @throws BizzException
	 */
	int handleCanAddVote(Integer circleId,Integer memberId,YesNoEnum canAddVote) throws BizzException;
	/**
	 * 授权发布活动
	 * @param circleId
	 * @param memberId
	 * @param canAddActivity
	 * @return
	 * @throws BizzException
	 */
	int handleCanAddActivity(Integer circleId,Integer memberId,YesNoEnum canAddActivity) throws BizzException;
	
	/**
	 * 是否有权限发布投票
	 * @param userId
	 * @param circleId
	 * @return
	 */
	boolean isCanAddVote2Circle(Integer userId, Integer circleId);
	/**
	 * 是否有权限发布活动
	 * @param userId
	 * @param circleId
	 * @return
	 */
	boolean isCanAddActivity2Circle(Integer userId, Integer circleId);

	/**
	 * 查询成员的等级头衔名称
	 * @param userId
	 * @param circleId
	 * @return
	 */
	String getCircleMemberGradeName(Integer userId, Integer circleId);

	/**
	 * 查询圈子部份成员列表 
	 * @param circleId
	 * @param queryCount
	 * @return
	 */
	List<CircleMemberVo> queryPartOfCircleMembers(int circleId, int queryCount);
	
	/**
	 * 查询圈子成员ID列表 -所有的
	 * @param circleId
	 * @return
	 */
	List<Integer> queryCircleMemberIds(Integer circleId);

	/**
	 * 查询圈子成员的完整信息
	 * @param circleId
	 * @return
	 */
	List<CircleMemberVo> queryCircleFullMember(Integer circleId);

	/**
	 * 查询圈子成员的完整信息-to map
	 * @param circleId
	 * @return
	 */
	LinkedHashMap<Integer, CircleMemberVo> getCircleFullMemberMap(Integer circleId);

	/**
	 * 查询发布了话题的圈子成员的完整信息 
	 * @param circleId
	 * @return
	 */
	List<CircleMemberVo> queryCircleTopicCreators(Integer circleId);

	/**
	 * 查询发布了话题的圈子成员的完整信息 - to map
	 * @param circleId
	 * @return
	 */
	LinkedHashMap<Integer, CircleMemberVo> getCircleTopicCreatorsMap(Integer circleId);

	/**
	 * 查询圈子部份成员的完整信息
	 * @param circleId
	 * @return
	 */
	List<CircleMemberVo> queryPartOfCircleFullMember(Integer circleId);

	/**
	 * 用户加入群聊【专用】
	 * @param userId
	 * @param chatCircleId
	 * @return
	 * @throws BizzException
	 */
	int handleJoinGroupChat(Integer userId, Integer chatCircleId) throws BizzException;

	
	/**
	 * 查询圈子的管理员列表
	 * @param circleId
	 * @return
	 */
	List<CircleMemberVo> queryCircleManagers(int circleId);

	/**
	 * 同步最后发布话题的时间
	 * @param memberId
	 * @param circleId
	 * @return
	 */
	int syncLastTopicTime(Integer memberId, Integer circleId);
	
}